<?php
/**
 * <i>escape</i>定义
 * 
 * @version $Id: IMintEscapeModifier.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.mint.modifier
 * @since 0.0.2
 */
class IMintEscapeModifier extends IAbstractMintModifier {
	/**
	 * 构造器
	 *
	 */	
	public function __construct() {
		
	}
	
	/**
	 * 执行
	 *
	 * 这里的实现借鉴了smarty 2.6.18的modifier.escape插件
	 * 
	 * @return scalar
	 */
	function execute (/** $escType, $charset **/) {
		$string = $this->getVariable();
		$arguments = $this->getArguments();
		$esc_type = (isset($arguments[0]))?$arguments[0]:"html";
		$char_set = (isset($arguments[1]))?$arguments[1]:"ISO-8859-1";
	    switch ($esc_type) {
	        case 'html':
	            return htmlspecialchars($string, ENT_QUOTES, $char_set);
	
	        case 'htmlall':
	            return htmlentities($string, ENT_QUOTES, $char_set);
	
	        case 'url':
	            return rawurlencode($string);
	
	        case 'urlpathinfo':
	            return str_replace('%2F','/',rawurlencode($string));
	            
	        case 'quotes':
	            // escape unescaped single quotes
	            return preg_replace("%(?<!\\\\)'%", "\\'", $string);
	
	        case 'hex':
	            // escape every character into hex
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '%' . bin2hex($string[$x]);
	            }
	            return $return;
	            
	        case 'hexentity':
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '&#x' . bin2hex($string[$x]) . ';';
	            }
	            return $return;
	
	        case 'decentity':
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '&#' . ord($string[$x]) . ';';
	            }
	            return $return;
	
	        case 'javascript':
	            // escape quotes and backslashes, newlines, etc.
	            return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
	            
	        case 'mail':
	            // safe way to display e-mail address on a web page
	            return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
	            
	        case 'nonstd':
	           // escape non-standard chars, such as ms document quotes
	           $_res = '';
	           for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
	               $_ord = ord(substr($string, $_i, 1));
	               // non-standard char, escape it
	               if($_ord >= 126){
	                   $_res .= '&#' . $_ord . ';';
	               }
	               else {
	                   $_res .= substr($string, $_i, 1);
	               }
	           }
	           return $_res;
	
	        default:
	            return $string;
	    }
	}

}

?>